#include "communicate.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <iostream>
#include "cmd.h"
communicate::communicate(QObject *parent)
    : QObject{parent}
{
    //连接服务器
    s.connectToHost(QHostAddress("192.168.100.128"),8888);
    connect(&s,SIGNAL(readyRead()),this,SLOT(readClientData()));
}

void communicate::writeClientData(const QJsonObject &json)
{
    QJsonDocument d(json);
    QByteArray sendData=d.toJson();
    int len=sendData.size();

    s.write((char*)&len,sizeof(int));//长度
    s.write(sendData);
    s.flush();
}

void communicate::readClientData()
{
    static QByteArray buffer;          // 缓存未处理的数据
    buffer += s.readAll();             // 累加新收到的数据

    while (buffer.size() >= (int)sizeof(int)) {
        // 取消息长度（假设发送端直接发送 int，不考虑字节序）
        int len = 0;
        memcpy(&len, buffer.constData(), sizeof(int));

        // 如果消息未收完整，等待下一次 readyRead()
        if (buffer.size() < sizeof(int) + len)
            break;

        // 提取完整消息
        QByteArray msg = buffer.mid(sizeof(int), len);

        // 剩余数据继续保留在 buffer
        buffer = buffer.mid(sizeof(int) + len);

        // 解析 JSON
        QJsonDocument dt = QJsonDocument::fromJson(msg);
        if (dt.isNull())
            continue;

        QJsonObject jsonData = dt.object();

        // 处理具体逻辑
        int cmd = jsonData["cmd"].toInt();
        std::cout << "cmd: " << cmd << std::endl;

        switch (cmd) {
        case REGISTER:
            emit rstResult(jsonData["result"].toInt());
            break;
        case LOGIN:
            emit m_rstLogin(jsonData);
            break;
        case SINGLE_GETQ:
            emit  receiveSingleQ(jsonData["question"].toArray());
            break;
        case RANK:
            emit  Rank(jsonData);
            break;
        case ANSWER:
            emit  Rank(jsonData);
            break;
        case RANKRESULT:
            emit  Rank(jsonData);
            break;
        default:
            break;
        }
    }
}


